/**
 * @file .
 * @author wangxiaowei <wangxiaowei0303@163.com>
 * @date 2015-05-28 01:02
 */

/*
 * 图像直方图处理工具;当前有:
 * a. 计算图像的直方图.
 * b. 显示图像的直方图.
 */

#ifndef org_wxw0303_bishe_src_HistUtil_h_
#define org_wxw0303_bishe_src_HistUtil_h_

namespace cv {
class Mat;
};

struct HistUtil {
    
    enum {
        /* 
         * 图像像素灰度值的最大值,最小值.
         * TODO 该变量定义在这个地方感觉不合适.:-(
         */
        IMG_GRAY_VAL_MAX = 255,
        IMG_GRAY_VAL_MIN = 0,
    };

    /*
     * 计算图像 img 的直方图.
     * 当函数返回后,hist[i] 存放着图像中灰度级为 i 的像素个数.
     * @param img 要求:CV_8UC1 类型.
     * @param hist 要求:指向着长度至少为(IMG_GRAY_VAL_MAX + 1)的数组.
     */
    static void
    calc(const cv::Mat &img,unsigned int *hist);
    
    /*
     * 将 [hist,hist + histNum) 中包含的直方图说明绘制到画板上,之后可以使用
     * imshow() 展示出来.此处的画板是一个 Mat 类型的对象.
     * @param h 画板的高度,单位:像素.若为 0,则表明与画板的宽度相同.
     * @param pph pixel per histogram,直方图中每一柱占用的像素数.1 为最佳.
     *            此时画板的宽度为 histNum * pph.
     * @return 绘制结果.
     */
    static cv::Mat
    draw(const unsigned int *hist,unsigned int pph = 1,unsigned int h = 0,
        unsigned int histNum = IMG_GRAY_VAL_MAX + 1);
};

#endif /* org_wxw0303_bishe_src_HistUtil_h_ */



